interface LabelledValue {
    label:string
}


function printLabel(labelObj:LabelledValue){
    console.log(labelObj.label);
}

let myObj = {size:10,label:"111",age:22}
let errObj = {size:10,age:22}
printLabel(myObj)
printLabel(errObj) // 会报错 因为 缺少必需键 label


// 可选属性
interface SquareConfig {
    color?:string,
    width?:number,
    label:string
}

function createSquare(config:SquareConfig):{color:string,area:number}{
    let newSquare = {color:"white",area:100}
    // 拼错时候会有错误提示 clor
    if(config.colour){
        newSquare.color = config.color
    }
    if(config.width){
        newSquare.area = config.width*config.width
    }
    return newSquare
}

// 额外的属性检查
let mySquare = createSquare({colour:"red",width:100,label:"2222"})
let mySquare0 = createSquare({color:"red",label:"2222"})
let mySquare1 = createSquare({width:100,label:"2222"})

// 函数的定义
interface TestFunc {
    (str:string,num:number):boolean
}

let testFunc:TestFunc

testFunc = (str,num) => {
    return Number(str)>num
}

// 可索引的类型 数组啥的
interface StringArray {
    // 使用number进行索引
    [index:number]:string
}

const myArray:StringArray = ['1','2']
const myArray2:StringArray = ['1',2] //警告报错
let myStr = myArray[1]
// 使用字符串作为索引

class Animals {
    name:string
}
// Dog 类是 Animals 的子项
class Dog extends Animals {
    breed:string
}

interface AnimaildInt{
    // 正确写法
    // [x:string]:Animals,
    // [x:number]:Dog,
    // 错误写法
    [x:number]:Animals,
    [x:string]:Dog
}

// 接口定义类
interface ClockConstructorOld {
    // new (hour: number, minute: number);
    tick():void,
    num:number,
    // 构造器属于静态方法
    constructor():void
}

class Clock implements ClockConstructorOld {
    currentTime: Date;
    num:111;
    // 静态部分
    constructor(h: number, m: number) { }
    tick(){
        console.log("111")
    }
}


interface ClockInterface {
    tick():void,// 类原始接口
}
interface ClockConstructor { // 构造器 接口
    // ClockInterface 是含有 tick() 方法的接口 而 ClockConstructor 是ClockInterface类型的构造函数则需要包含tick()方法
    new (hour:number,minute:number):ClockInterface // 在用接口进行包装一下
}
class DigitalClock implements ClockInterface {
    // 静态方法
    constructor(h:number,m:number){}
    tick(){
        console.log("beep beep");
    }
}
// 构造器函数 传入 构造器接口类型的构造器对象 和 类需要的参数 返回生成的对象
function createClock(ctor:ClockConstructor,hour:number,minute:number):ClockInterface{
    return new ctor(hour,minute)
}

let digital = createClock(DigitalClock,12,17)

class AnalogClock implements ClockInterface {
    constructor(h:number,m:number){}
    tick(){
        console.log("tick")
    }
}

// let analog = createClock(AnalogClock,7,32)